k8s NetworkPolicy 网络策略是怎么样的 | 您所在的位置:网站首页 › nginx keepalived k8s › k8s NetworkPolicy 网络策略是怎么样的 |
本文正在参加「金石计划」 前言随着微服务的流行,越来越多的云服务平台需要大量模块之间的网络调用。 在 Kubernetes 中,网络策略(NetworkPolicy)是一种强大的机制,可以控制 Pod 之间和 Pod 与外部网络之间的流量。 Kubernetes 中的 NetworkPolicy 定义了一组规则,这些规则允许或者拒绝特定流量的传输。通过使用 NetworkPolicy,Kubernetes 管理员能够更好地掌控容器网络,确保应用程序的网络安全性。 NetworkPolicy 可以实现什么NetworkPolicy 可被定义为 Pod 标签选择器、命名空间选择器或者两者的组合。它可以实现以下功能: 限制 Pod 之间的流量:通过指定 Ingress 规则,可以阻止来自其他 Pod 的流量进入目标 Pod。 允许 Pod 之间的流量:需要为目标 Pod 配置 Egress 规则,以便只允许来自特定 Pod 的流量进入。 限制 Pod 与外部网络的通信:通过指定 Egress 规则,可以控制哪些类型的外部流量可以进入 Pod,并防止未经授权的访问。 允许 Pod 与外部网络的通信:需要为目标 Pod 配置 Ingress 规则,以便只允许来自特定 IP 地址、端口或协议的流量进入。 使用 NetworkPolicy 时,需要考虑什么使用 NetworkPolicy 时,需要考虑以下几个方面: NetworkPolicy 只在支持它的网络插件中起作用,例如 Calico、Cilium 和 Weave Net 等。 没有定义任何 NetworkPolicy 规则,则所有的流量都会被允许。 定义 NetworkPolicy 后,它只适用于当前命名空间中的 Pod。 在 NetworkPolicy 中指定标签选择器时,应保证其唯一性,以免给其他 Pod 带来影响。 网络策略有哪些默认情况下,如果名字空间中不存在任何策略,则所有进出该名字空间中 Pod 的流量都被允许。 Namespace 隔离流量默认情况下,所有 Pod 之间都是互通的。每个 Namespace 可以配置独立的网络策略,来隔离 Pod 之间的网络流量。 由此,可以通过创建匹配 Pod 的 Network Policy 来作为默认的网络策略,比如默认拒绝所有 Pod 之间 Ingress 的通信,如下: apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default-deny spec: podSelector: {} policyTypes: - Ingress 复制代码默认拒绝 Pod 之间 Egress(出口) 通信的策略: apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default-deny spec: podSelector: {} policyTypes: - Egress 复制代码甚至是默认拒绝 Pod 之间 Ingress(入口) 和 Egress(出口) 通信的策略: apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default-deny spec: podSelector: {} policyTypes: - Ingress - Egress 复制代码 Pod 隔离Pod 隔离可以分为出口的隔离和入口的隔离。其实这里的“隔离”不是绝对的,而是还有一些其它限制。 比如可以通过使用标签选择器(这里可以是 namespaceSelector 和 podSelector)来控制 Pod 之间的流量。 如下面的 Network Policy: 允许 default namespace 中带有 role=myfront 标签的 Pod 访问 default namespace 中带有 role=mydb 标签 Pod 的 6379 端口 允许带有 project=myprojects 标签的 namespace 中所有 Pod 访问 default namespace 中带有 role=mydb 标签 Pod 的 6379 端口 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: test-network-policy namespace: default spec: podSelector: matchLabels: role: mydb ingress: - from: - namespaceSelector: matchLabels: project: myproject - podSelector: matchLabels: role: myfront ports: - protocol: tcp port: 6379 复制代码另外一个同时开启 Ingress 和 Egress 通信的策略为: apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: test-network-policy namespace: default spec: podSelector: matchLabels: role: mydb policyTypes: - Ingress - Egress ingress: - from: - ipBlock: cidr: 192.168.0.0/16 except: - 192.168.1.0/24 - namespaceSelector: matchLabels: project: myproject - podSelector: matchLabels: role: myfront ports: - protocol: TCP port: 6379 egress: - to: - ipBlock: cidr: 10.1.0.0/24 ports: - protocol: TCP port: 5978 复制代码它用来隔离 default namespace 中带有 role=mydb 标签的 Pod: 允许 default namespace 中带有 role=myfront 标签的 Pod 访问 default namespace 中带有 role=mydb 标签 Pod 的 6379 端口 允许带有 project=myprojects 标签的 namespace 中所有 Pod 访问 default namespace 中带有 role=mydb 标签 Pod 的 6379 端口 允许 default namespace 中带有 role=mydb 标签的 Pod 访问 10.1.0.0/24 网段的 TCP 5987 端口 使用场景 禁止访问指定服务 kubectl run web --image=nginx --labels app=web,env=prod --expose --port 80 复制代码网络策略如下: kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: web-deny-all spec: podSelector: matchLabels: app: web env: prod 复制代码 只允许指定 Pod 访问服务 kubectl run apiserver --image=nginx --labels app=bookstore,role=api --expose --port 80 复制代码网络策略如下: kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: api-allow spec: podSelector: matchLabels: app: bookstore role: api ingress: - from: - podSelector: matchLabels: app: bookstore 复制代码 禁止 namespace 中所有 Pod 之间的相互访问 apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default-deny namespace: default spec: podSelector: {} 复制代码 禁止其他 namespace 访问服务 kubectl create namespace secondary kubectl run web --namespace secondary --image=nginx \ --labels=app=web --expose --port 80 复制代码网络策略配置如下: kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: namespace: secondary name: web-deny-other-namespaces spec: podSelector: matchLabels: ingress: - from: - podSelector: {} 复制代码此策略可以确保即使没有被其他任何 NetworkPolicy 选择的 Pod 也不会被允许流出流量。 此策略不会更改任何 Pod 的入站流量隔离行为。 只允许指定 namespace 访问服务 kubectl run web --image=nginx \ --labels=app=web --expose --port 80 复制代码网络策略如下: kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: web-allow-prod spec: podSelector: matchLabels: app: web ingress: - from: - namespaceSelector: matchLabels: purpose: production 复制代码 允许外网访问服务 kubectl run web --image=nginx --labels=app=web --port 80 kubectl expose deployment/web --type=LoadBalancer 复制代码网络策略如下: kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: web-allow-external spec: podSelector: matchLabels: app: web ingress: - ports: - port: 80 from: [] 复制代码有了这个策略,任何额外的策略都不会导致来自这些 Pod 的任何出站连接被拒绝。 此策略对进入任何 Pod 的隔离没有影响。 以上这些使用场景的 YAML 配置定义就不再赘述了,有不明白的地方可以看下我之前的文章。 总结Kubernetes 中的 NetworkPolicy 是一个非常重要的特性,可以控制容器网络的流量和安全,确保应用程序的可靠性和安全性。 为了更好地使用它,需要对其有一定的理解并遵循相应的配置和管理规则。 本文正在参加「金石计划」 |
CopyRight 2018-2019 实验室设备网 版权所有 |